
#ifndef Color_h
#define Color_h

#include <Typedef.h>
#include <Defines.h>
#include <CSharpPropertyMethods.h>

#include <System/Object.h>
#include <System/Byte.h>
#include <System/Single.h>

#include "RMathHelper.h"
#include "Vector3.h"
#include "Vector4.h"

namespace Riccsson
{
	namespace Xna
	{
		namespace Framework
		{
			struct Color
				//: IEquatable<Color>
			{
			// ARGB
				private: uint _packedValue;
				PROP3(Color, uint, PackedValue)
				PROP3(Color, byte, A)
				PROP3(Color, byte, R)
				PROP3(Color, byte, G)
				PROP3(Color, byte, B)

				/// <summary>
				/// Packed value.
				/// </summary>
				public: PROP3_GET(uint, PackedValue)
				{
					return this->_packedValue;
				}
				public: PROP3_SET(uint, PackedValue)
				{
					this->_packedValue = value;
				}

				/// <summary>
				/// Gets or sets the blue component of <see cref="Color"/>.
				/// </summary>
				public: PROP3_GET(byte, B)
				{
					return (byte)(this->_packedValue >> 16);
				}
				public: PROP3_SET(byte, B)
				{
					this->_packedValue = (this->_packedValue & 0xff00ffff) | (uint)(value << 16);
				}
	
				/// <summary>
				/// Gets or sets the green component of <see cref="Color"/>.
				/// </summary>
				public: PROP3_GET(byte, G)
				{
					return (byte)(this->_packedValue >> 8);
				}
				public: PROP3_SET(byte, G)
				{
					this->_packedValue = (this->_packedValue & 0xffff00ff) | ((uint)(value << 8));
				}
	
				/// <summary>
				/// Gets or sets the red component of <see cref="Color"/>.
				/// </summary>
				public: PROP3_GET(byte, R)
				{
					return (byte)(this->_packedValue);
				}
				public: PROP3_SET(byte, R)
				{
					this->_packedValue = (this->_packedValue & 0xffffff00) | value;
				}

				/// <summary>
				/// Gets or sets the alpha component of <see cref="Color"/>.
				/// </summary>
				public: PROP3_GET(byte, A)
				{
					return (byte)(this->_packedValue >> 24);
				}
				public: PROP3_SET(byte, A)
				{
					this->_packedValue = (this->_packedValue & 0x00ffffff) | ((uint)(value << 24));
				}

				public: Color()
					: PROP3_INIT(Color, PackedValue)
					, PROP3_INIT(Color, A)
					, PROP3_INIT(Color, R)
					, PROP3_INIT(Color, G)
					, PROP3_INIT(Color, B)
				{
					_packedValue = 0;
				}
	  
				private: Color(uint packedValue)
					: PROP3_INIT(Color, PackedValue)
					, PROP3_INIT(Color, A)
					, PROP3_INIT(Color, R)
					, PROP3_INIT(Color, G)
					, PROP3_INIT(Color, B)
				{
					_packedValue = packedValue;
					// ARGB
					//_packedValue = (packedValue << 8) | ((packedValue & 0xff000000) >> 24);
					// ABGR			
					//_packedValue = (packedValue & 0xff00ff00) | ((packedValue & 0x000000ff) << 16) | ((packedValue & 0x00ff0000) >> 16);
				}

				COPY_CONSTRUCTOR(Color)
				{
					PROP3_INIT_COPY(Color, uint, PackedValue);
					PROP3_INIT_COPY(Color, byte, A);
					PROP3_INIT_COPY(Color, byte, R);
					PROP3_INIT_COPY(Color, byte, G);
					PROP3_INIT_COPY(Color, byte, B);

					this->_packedValue = other._packedValue;
				}

				/// <summary>
				/// Creates a new instance of <see cref="Color"/> struct.
				/// </summary>
				/// <param name="color">A <see cref="Vector4"/> representing color.</param>
				public: Color(Vector4 color)
					: PROP3_INIT(Color, PackedValue)
					, PROP3_INIT(Color, A)
					, PROP3_INIT(Color, R)
					, PROP3_INIT(Color, G)
					, PROP3_INIT(Color, B)
				{
					_packedValue = 0;
			
					R = (byte)MathHelper::ClampF((float)(color.X * 255), (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					G = (byte)MathHelper::ClampF((float)(color.Y * 255), (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					B = (byte)MathHelper::ClampF((float)(color.Z * 255), (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					A = (byte)MathHelper::ClampF((float)(color.W * 255), (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
				}

				/// <summary>
				/// Creates a new instance of <see cref="Color"/> struct.
				/// </summary>
				/// <param name="color">A <see cref="Vector3"/> representing color.</param>
				public: Color(Vector3 color)
					: PROP3_INIT(Color, PackedValue)
					, PROP3_INIT(Color, A)
					, PROP3_INIT(Color, R)
					, PROP3_INIT(Color, G)
					, PROP3_INIT(Color, B)
				{
					_packedValue = 0;

					R = (byte)MathHelper::ClampF((float)(color.X * 255), (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					G = (byte)MathHelper::ClampF((float)(color.Y * 255), (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					B = (byte)MathHelper::ClampF((float)(color.Z * 255), (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					A = 255;
				}
	
				/// <summary>
				/// Creates a new instance of <see cref="Color"/> struct.
				/// </summary>
				/// <param name="color">A <see cref="Color"/> for RGB values of new <see cref="Color"/> instance.</param>
				/// <param name="alpha">Alpha component value.</param>
				public: Color(Color color, int alpha)
					: PROP3_INIT(Color, PackedValue)
					, PROP3_INIT(Color, A)
					, PROP3_INIT(Color, R)
					, PROP3_INIT(Color, G)
					, PROP3_INIT(Color, B)
				{
					_packedValue = 0;

					R = color.R;
					G = color.G;
					B = color.B;
					A = (byte)MathHelper::ClampF((float)alpha, (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
				}
	
				/// <summary>
				/// Creates a new instance of <see cref="Color"/> struct.
				/// </summary>
				/// <param name="color">A <see cref="Color"/> for RGB values of new <see cref="Color"/> instance.</param>
				/// <param name="alpha">Alpha component value.</param>
				public: Color(Color color, float alpha)
					: PROP3_INIT(Color, PackedValue)
					, PROP3_INIT(Color, A)
					, PROP3_INIT(Color, R)
					, PROP3_INIT(Color, G)
					, PROP3_INIT(Color, B)
				{
					_packedValue = 0;

					R = color.R;
					G = color.G;
					B = color.B;
					A = (byte)MathHelper::ClampF((float)(alpha * 255), (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
				}
	
				/// <summary>
				/// Creates a new instance of <see cref="Color"/> struct.
				/// </summary>
				/// <param name="r">Red component value.</param>
				/// <param name="g">Green component value.</param>
				/// <param name="b">Blue component value</param>
				public: Color(float r, float g, float b)
					: PROP3_INIT(Color, PackedValue)
					, PROP3_INIT(Color, A)
					, PROP3_INIT(Color, R)
					, PROP3_INIT(Color, G)
					, PROP3_INIT(Color, B)
				{
					_packedValue = 0;
			
					R = (byte)MathHelper::ClampF((float)(r * 255), (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					G = (byte)MathHelper::ClampF((float)(g * 255), (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					B = (byte)MathHelper::ClampF((float)(b * 255), (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					A = 255;
				}
	
				/// <summary>
				/// Creates a new instance of <see cref="Color"/> struct.
				/// </summary>
				/// <param name="r">Red component value.</param>
				/// <param name="g">Green component value.</param>
				/// <param name="b">Blue component value</param>
				public: Color(int r, int g, int b)
					: PROP3_INIT(Color, PackedValue)
					, PROP3_INIT(Color, A)
					, PROP3_INIT(Color, R)
					, PROP3_INIT(Color, G)
					, PROP3_INIT(Color, B)
				{
					_packedValue = 0;
					R = (byte)MathHelper::ClampF((float)r, (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					G = (byte)MathHelper::ClampF((float)g, (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					B = (byte)MathHelper::ClampF((float)b, (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					A = (byte)255;
				}

				/// <summary>
				/// Creates a new instance of <see cref="Color"/> struct.
				/// </summary>
				/// <param name="r">Red component value.</param>
				/// <param name="g">Green component value.</param>
				/// <param name="b">Blue component value</param>
				/// <param name="alpha">Alpha component value.</param>
				public: Color(int r, int g, int b, int alpha)
					: PROP3_INIT(Color, PackedValue)
					, PROP3_INIT(Color, A)
					, PROP3_INIT(Color, R)
					, PROP3_INIT(Color, G)
					, PROP3_INIT(Color, B)
				{
					_packedValue = 0;
					R = (byte)MathHelper::ClampF((float)r, (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					G = (byte)MathHelper::ClampF((float)g, (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					B = (byte)MathHelper::ClampF((float)b, (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					A = (byte)MathHelper::ClampF((float)alpha, (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
				}
	
				/// <summary>
				/// Creates a new instance of <see cref="Color"/> struct.
				/// </summary>
				/// <param name="r">Red component value.</param>
				/// <param name="g">Green component value.</param>
				/// <param name="b">Blue component value</param>
				/// <param name="alpha">Alpha component value.</param>
				public: Color(float r, float g, float b, float alpha)
					: PROP3_INIT(Color, PackedValue)
					, PROP3_INIT(Color, A)
					, PROP3_INIT(Color, R)
					, PROP3_INIT(Color, G)
					, PROP3_INIT(Color, B)
				{
					_packedValue = 0;
			
					R = (byte)MathHelper::ClampF((float)(r * 255), (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					G = (byte)MathHelper::ClampF((float)(g * 255), (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					B = (byte)MathHelper::ClampF((float)(b * 255), (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
					A = (byte)MathHelper::ClampF((float)(alpha * 255), (float)Riccsson::System::Byte::MinValue, (float)Riccsson::System::Byte::MaxValue);
				}
        
		
				/// <summary>
				/// Gets the hash code for <see cref="Color"/> instance.
				/// </summary>
				/// <returns>Hash code of the object.</returns>
				public: override int GetHashCode()
				{
					//return this->_packedValue.GetHashCode();
					throw;
				}
	
				/// <summary>
				/// Compares whether current instance is equal to specified object.
				/// </summary>
				/// <param name="obj">The <see cref="Color"/> to compare.</param>
				/// <returns><c>true</c> if the instances are equal; <c>false</c> otherwise.</returns>
				public: override bool Equals(const Riccsson::System::Object* obj)
				{
					//return ( instanceof_const(obj, Color) && Riccsson::System::Object::Equals(obj));
					throw;
				}
	
				/// <summary>
				/// TransparentBlack color (R:0,G:0,B:0,A:0).
				/// </summary>
				public: static const Color TransparentBlack;
        
				/// <summary>
				/// Transparent color (R:0,G:0,B:0,A:0).
				/// </summary>
				public: static const Color Transparent;
	
				/// <summary>
				/// AliceBlue color (R:240,G:248,B:255,A:255).
				/// </summary>
				public: static const Color AliceBlue;
        
				/// <summary>
				/// AntiqueWhite color (R:250,G:235,B:215,A:255).
				/// </summary>
				public: static const Color AntiqueWhite;
        
				/// <summary>
				/// Aqua color (R:0,G:255,B:255,A:255).
				/// </summary>
				public: static const Color Aqua;
	
				/// <summary>
				/// Aquamarine color (R:127,G:255,B:212,A:255).
				/// </summary>
				public: static const Color Aquamarine;
        
				/// <summary>
				/// Azure color (R:240,G:255,B:255,A:255).
				/// </summary>
				public: static const Color Azure;
	
				/// <summary>
				/// Beige color (R:245,G:245,B:220,A:255).
				/// </summary>
				public: static const Color Beige;
        
				/// <summary>
				/// Bisque color (R:255,G:228,B:196,A:255).
				/// </summary>
				public: static const Color Bisque;
        
				/// <summary>
				/// Black color (R:0,G:0,B:0,A:255).
				/// </summary>
				public: static const Color Black;
        
				/// <summary>
				/// BlanchedAlmond color (R:255,G:235,B:205,A:255).
				/// </summary>
				public: static const Color BlanchedAlmond;
        
				/// <summary>
				/// Blue color (R:0,G:0,B:255,A:255).
				/// </summary>
				public: static const Color Blue;
        
				/// <summary>
				/// BlueViolet color (R:138,G:43,B:226,A:255).
				/// </summary>
				public: static const Color BlueViolet;
        
				/// <summary>
				/// Brown color (R:165,G:42,B:42,A:255).
				/// </summary>
				public: static const Color Brown;
        
				/// <summary>
				/// BurlyWood color (R:222,G:184,B:135,A:255).
				/// </summary>
				public: static const Color BurlyWood;
        
				/// <summary>
				/// CadetBlue color (R:95,G:158,B:160,A:255).
				/// </summary>
				public: static const Color CadetBlue;
        
				/// <summary>
				/// Chartreuse color (R:127,G:255,B:0,A:255).
				/// </summary>
				public: static const Color Chartreuse;
         
				/// <summary>
				/// Chocolate color (R:210,G:105,B:30,A:255).
				/// </summary>
				public: static const Color Chocolate;
        
				/// <summary>
				/// Coral color (R:255,G:127,B:80,A:255).
				/// </summary>
				public: static const Color Coral;
        
				/// <summary>
				/// CornflowerBlue color (R:100,G:149,B:237,A:255).
				/// </summary>
				public: static const Color CornflowerBlue;
        
				/// <summary>
				/// Cornsilk color (R:255,G:248,B:220,A:255).
				/// </summary>
				public: static const Color Cornsilk;
	
				/// <summary>
				/// Crimson color (R:220,G:20,B:60,A:255).
				/// </summary>
				public: static const Color Crimson;
        
				/// <summary>
				/// Cyan color (R:0,G:255,B:255,A:255).
				/// </summary>
				public: static const Color Cyan;
        
				/// <summary>
				/// DarkBlue color (R:0,G:0,B:139,A:255).
				/// </summary>
				public: static const Color DarkBlue;
	
				/// <summary>
				/// DarkCyan color (R:0,G:139,B:139,A:255).
				/// </summary>
				public: static const Color DarkCyan;
        
				/// <summary>
				/// DarkGoldenrod color (R:184,G:134,B:11,A:255).
				/// </summary>
				public: static const Color DarkGoldenrod;
        
				/// <summary>
				/// DarkGray color (R:169,G:169,B:169,A:255).
				/// </summary>
				public: static const Color DarkGray;
	
				/// <summary>
				/// DarkGreen color (R:0,G:100,B:0,A:255).
				/// </summary>
				public: static const Color DarkGreen;
        
				/// <summary>
				/// DarkKhaki color (R:189,G:183,B:107,A:255).
				/// </summary>
				public: static const Color DarkKhaki;

				/// <summary>
				/// DarkMagenta color (R:139,G:0,B:139,A:255).
				/// </summary>
				public: static const Color DarkMagenta;

				/// <summary>
				/// DarkOliveGreen color (R:85,G:107,B:47,A:255).
				/// </summary>
				public: static const Color DarkOliveGreen;

				/// <summary>
				/// DarkOrange color (R:255,G:140,B:0,A:255).
				/// </summary>
				public: static const Color DarkOrange;

				/// <summary>
				/// DarkOrchid color (R:153,G:50,B:204,A:255).
				/// </summary>
				public: static const Color DarkOrchid;

				/// <summary>
				/// DarkRed color (R:139,G:0,B:0,A:255).
				/// </summary>
				public: static const Color DarkRed;
        
				/// <summary>
				/// DarkSalmon color (R:233,G:150,B:122,A:255).
				/// </summary>
				public: static const Color DarkSalmon;

				/// <summary>
				/// DarkSeaGreen color (R:143,G:188,B:139,A:255).
				/// </summary>
				public: static const Color DarkSeaGreen;

				/// <summary>
				/// DarkSlateBlue color (R:72,G:61,B:139,A:255).
				/// </summary>
				public: static const Color DarkSlateBlue;

				/// <summary>
				/// DarkSlateGray color (R:47,G:79,B:79,A:255).
				/// </summary>
				public: static const Color DarkSlateGray;

				/// <summary>
				/// DarkTurquoise color (R:0,G:206,B:209,A:255).
				/// </summary>
				public: static const Color DarkTurquoise;

				/// <summary>
				/// DarkViolet color (R:148,G:0,B:211,A:255).
				/// </summary>
				public: static const Color DarkViolet;
         
				/// <summary>
				/// DeepPink color (R:255,G:20,B:147,A:255).
				/// </summary>
				public: static const Color DeepPink;

				/// <summary>
				/// DeepSkyBlue color (R:0,G:191,B:255,A:255).
				/// </summary>
				public: static const Color DeepSkyBlue;

				/// <summary>
				/// DimGray color (R:105,G:105,B:105,A:255).
				/// </summary>
				public: static const Color DimGray;

				/// <summary>
				/// DodgerBlue color (R:30,G:144,B:255,A:255).
				/// </summary>
				public: static const Color DodgerBlue;

				/// <summary>
				/// Firebrick color (R:178,G:34,B:34,A:255).
				/// </summary>
				public: static const Color Firebrick;

				/// <summary>
				/// FloralWhite color (R:255,G:250,B:240,A:255).
				/// </summary>
				public: static const Color FloralWhite;

				/// <summary>
				/// ForestGreen color (R:34,G:139,B:34,A:255).
				/// </summary>
				public: static const Color ForestGreen;
        
				/// <summary>
				/// Fuchsia color (R:255,G:0,B:255,A:255).
				/// </summary>
				public: static const Color Fuchsia;

				/// <summary>
				/// Gainsboro color (R:220,G:220,B:220,A:255).
				/// </summary>
				public: static const Color Gainsboro;

				/// <summary>
				/// GhostWhite color (R:248,G:248,B:255,A:255).
				/// </summary>
				public: static const Color GhostWhite;

				/// <summary>
				/// Gold color (R:255,G:215,B:0,A:255).
				/// </summary>
				public: static const Color Gold;

				/// <summary>
				/// Goldenrod color (R:218,G:165,B:32,A:255).
				/// </summary>
				public: static const Color Goldenrod;

				/// <summary>
				/// Gray color (R:128,G:128,B:128,A:255).
				/// </summary>
				public: static const Color Gray;

				/// <summary>
				/// Green color (R:0,G:128,B:0,A:255).
				/// </summary>
				public: static const Color Green;

				/// <summary>
				/// GreenYellow color (R:173,G:255,B:47,A:255).
				/// </summary>
				public: static const Color GreenYellow;

				/// <summary>
				/// Honeydew color (R:240,G:255,B:240,A:255).
				/// </summary>
				public: static const Color Honeydew;

				/// <summary>
				/// HotPink color (R:255,G:105,B:180,A:255).
				/// </summary>
				public: static const Color HotPink;
        
				/// <summary>
				/// IndianRed color (R:205,G:92,B:92,A:255).
				/// </summary>
				public: static const Color IndianRed;
        
				/// <summary>
				/// Indigo color (R:75,G:0,B:130,A:255).
				/// </summary>
				public: static const Color Indigo;
        
				/// <summary>
				/// Ivory color (R:255,G:255,B:240,A:255).
				/// </summary>
				public: static const Color Ivory;

				/// <summary>
				/// Khaki color (R:240,G:230,B:140,A:255).
				/// </summary>
				public: static const Color Khaki;
        
				/// <summary>
				/// Lavender color (R:230,G:230,B:250,A:255).
				/// </summary>
				public: static const Color Lavender;
        
				/// <summary>
				/// LavenderBlush color (R:255,G:240,B:245,A:255).
				/// </summary>
				public: static const Color LavenderBlush;
        
				/// <summary>
				/// LawnGreen color (R:124,G:252,B:0,A:255).
				/// </summary>
				public: static const Color LawnGreen;

				/// <summary>
				/// LemonChiffon color (R:255,G:250,B:205,A:255).
				/// </summary>
				public: static const Color LemonChiffon;

				/// <summary>
				/// LightBlue color (R:173,G:216,B:230,A:255).
				/// </summary>
				public: static const Color LightBlue;

				/// <summary>
				/// LightCoral color (R:240,G:128,B:128,A:255).
				/// </summary>
				public: static const Color LightCoral;
        
				/// <summary>
				/// LightCyan color (R:224,G:255,B:255,A:255).
				/// </summary>
				public: static const Color LightCyan;

				/// <summary>
				/// LightGoldenrodYellow color (R:250,G:250,B:210,A:255).
				/// </summary>
				public: static const Color LightGoldenrodYellow;
        
				/// <summary>
				/// LightGray color (R:211,G:211,B:211,A:255).
				/// </summary>
				public: static const Color LightGray;

				/// <summary>
				/// LightGreen color (R:144,G:238,B:144,A:255).
				/// </summary>
				public: static const Color LightGreen;

				/// <summary>
				/// LightPink color (R:255,G:182,B:193,A:255).
				/// </summary>
				public: static const Color LightPink;

				/// <summary>
				/// LightSalmon color (R:255,G:160,B:122,A:255).
				/// </summary>
				public: static const Color LightSalmon;

				/// <summary>
				/// LightSeaGreen color (R:32,G:178,B:170,A:255).
				/// </summary>
				public: static const Color LightSeaGreen;

				/// <summary>
				/// LightSkyBlue color (R:135,G:206,B:250,A:255).
				/// </summary>
				public: static const Color LightSkyBlue;

				/// <summary>
				/// LightSlateGray color (R:119,G:136,B:153,A:255).
				/// </summary>
				public: static const Color LightSlateGray;

				/// <summary>
				/// LightSteelBlue color (R:176,G:196,B:222,A:255).
				/// </summary>
				public: static const Color LightSteelBlue;

				/// <summary>
				/// LightYellow color (R:255,G:255,B:224,A:255).
				/// </summary>
				public: static const Color LightYellow;

				/// <summary>
				/// Lime color (R:0,G:255,B:0,A:255).
				/// </summary>
				public: static const Color Lime;

				/// <summary>
				/// LimeGreen color (R:50,G:205,B:50,A:255).
				/// </summary>
				public: static const Color LimeGreen;

				/// <summary>
				/// Linen color (R:250,G:240,B:230,A:255).
				/// </summary>
				public: static const Color Linen;
				/// <summary>
				/// Magenta color (R:255,G:0,B:255,A:255).
				/// </summary>
				public: static const Color Magenta;

				/// <summary>
				/// Maroon color (R:128,G:0,B:0,A:255).
				/// </summary>
				public: static const Color Maroon;

				/// <summary>
				/// MediumAquamarine color (R:102,G:205,B:170,A:255).
				/// </summary>
				public: static const Color MediumAquamarine;

				/// <summary>
				/// MediumBlue color (R:0,G:0,B:205,A:255).
				/// </summary>
				public: static const Color MediumBlue;

				/// <summary>
				/// MediumOrchid color (R:186,G:85,B:211,A:255).
				/// </summary>
				public: static const Color MediumOrchid;

				/// <summary>
				/// MediumPurple color (R:147,G:112,B:219,A:255).
				/// </summary>
				public: static const Color MediumPurple;

				/// <summary>
				/// MediumSeaGreen color (R:60,G:179,B:113,A:255).
				/// </summary>
				public: static const Color MediumSeaGreen;

				/// <summary>
				/// MediumSlateBlue color (R:123,G:104,B:238,A:255).
				/// </summary>
				public: static const Color MediumSlateBlue;

				/// <summary>
				/// MediumSpringGreen color (R:0,G:250,B:154,A:255).
				/// </summary>
				public: static const Color MediumSpringGreen;

				/// <summary>
				/// MediumTurquoise color (R:72,G:209,B:204,A:255).
				/// </summary>
				public: static const Color MediumTurquoise;

				/// <summary>
				/// MediumVioletRed color (R:199,G:21,B:133,A:255).
				/// </summary>
				public: static const Color MediumVioletRed;

				/// <summary>
				/// MidnightBlue color (R:25,G:25,B:112,A:255).
				/// </summary>
				public: static const Color MidnightBlue;

				/// <summary>
				/// MintCream color (R:245,G:255,B:250,A:255).
				/// </summary>
				public: static const Color MintCream;

				/// <summary>
				/// MistyRose color (R:255,G:228,B:225,A:255).
				/// </summary>
				public: static const Color MistyRose;

				/// <summary>
				/// Moccasin color (R:255,G:228,B:181,A:255).
				/// </summary>
				public: static const Color Moccasin;

				/// <summary>
				/// NavajoWhite color (R:255,G:222,B:173,A:255).
				/// </summary>
				public: static const Color NavajoWhite;

				/// <summary>
				/// Navy color (R:0,G:0,B:128,A:255).
				/// </summary>
				public: static const Color Navy;

				/// <summary>
				/// OldLace color (R:253,G:245,B:230,A:255).
				/// </summary>
				public: static const Color OldLace;

				/// <summary>
				/// Olive color (R:128,G:128,B:0,A:255).
				/// </summary>
				public: static const Color Olive;

				/// <summary>
				/// OliveDrab color (R:107,G:142,B:35,A:255).
				/// </summary>
				public: static const Color OliveDrab;

				/// <summary>
				/// Orange color (R:255,G:165,B:0,A:255).
				/// </summary>
				public: static const Color Orange;

				/// <summary>
				/// OrangeRed color (R:255,G:69,B:0,A:255).
				/// </summary>
				public: static const Color OrangeRed;

				/// <summary>
				/// Orchid color (R:218,G:112,B:214,A:255).
				/// </summary>
				public: static const Color Orchid;

				/// <summary>
				/// PaleGoldenrod color (R:238,G:232,B:170,A:255).
				/// </summary>
				public: static const Color PaleGoldenrod;

				/// <summary>
				/// PaleGreen color (R:152,G:251,B:152,A:255).
				/// </summary>
				public: static const Color PaleGreen;

				/// <summary>
				/// PaleTurquoise color (R:175,G:238,B:238,A:255).
				/// </summary>
				public: static const Color PaleTurquoise;

				/// <summary>
				/// PaleVioletRed color (R:219,G:112,B:147,A:255).
				/// </summary>
				public: static const Color PaleVioletRed;

				/// <summary>
				/// PapayaWhip color (R:255,G:239,B:213,A:255).
				/// </summary>
				public: static const Color PapayaWhip;

				/// <summary>
				/// PeachPuff color (R:255,G:218,B:185,A:255).
				/// </summary>
				public: static const Color PeachPuff;

				/// <summary>
				/// Peru color (R:205,G:133,B:63,A:255).
				/// </summary>
				public: static const Color Peru;

				/// <summary>
				/// Pink color (R:255,G:192,B:203,A:255).
				/// </summary>
				public: static const Color Pink;

				/// <summary>
				/// Plum color (R:221,G:160,B:221,A:255).
				/// </summary>
				public: static const Color Plum;

				/// <summary>
				/// PowderBlue color (R:176,G:224,B:230,A:255).
				/// </summary>
				public: static const Color PowderBlue;

				/// <summary>
				///  Purple color (R:128,G:0,B:128,A:255).
				/// </summary>
				public: static const Color Purple;

				/// <summary>
				/// Red color (R:255,G:0,B:0,A:255).
				/// </summary>
				public: static const Color Red;

				/// <summary>
				/// RosyBrown color (R:188,G:143,B:143,A:255).
				/// </summary>
				public: static const Color RosyBrown;

				/// <summary>
				/// RoyalBlue color (R:65,G:105,B:225,A:255).
				/// </summary>
				public: static const Color RoyalBlue;

    			/// <summary>
				/// SaddleBrown color (R:139,G:69,B:19,A:255).
				/// </summary>
				public: static const Color SaddleBrown;
    	 
				/// <summary>
				/// Salmon color (R:250,G:128,B:114,A:255).
				/// </summary>
				public: static const Color Salmon;
        
				/// <summary>
				/// SandyBrown color (R:244,G:164,B:96,A:255).
				/// </summary>
				public: static const Color SandyBrown;
        
				/// <summary>
				/// SeaGreen color (R:46,G:139,B:87,A:255).
				/// </summary>
				public: static const Color SeaGreen;
        
    			/// <summary>
				/// SeaShell color (R:255,G:245,B:238,A:255).
				/// </summary>
				public: static const Color SeaShell;
        
    			/// <summary>
				/// Sienna color (R:160,G:82,B:45,A:255).
				/// </summary>
				public: static const Color Sienna;
        
    			/// <summary>
				/// Silver color (R:192,G:192,B:192,A:255).
				/// </summary>
				public: static const Color Silver;
        
				/// <summary>
				/// SkyBlue color (R:135,G:206,B:235,A:255).
				/// </summary>
				public: static const Color SkyBlue;
       
				/// <summary>
				/// SlateBlue color (R:106,G:90,B:205,A:255).
				/// </summary>
				public: static const Color SlateBlue;

				/// <summary>
				/// SlateGray color (R:112,G:128,B:144,A:255).
				/// </summary>
				public: static const Color SlateGray;
      
				/// <summary>
				/// Snow color (R:255,G:250,B:250,A:255).
				/// </summary>
				public: static const Color Snow;
      
				/// <summary>
				/// SpringGreen color (R:0,G:255,B:127,A:255).
				/// </summary>
				public: static const Color SpringGreen;
      
				/// <summary>
				/// SteelBlue color (R:70,G:130,B:180,A:255).
				/// </summary>
				public: static const Color SteelBlue;
      
				/// <summary>
				/// Tan color (R:210,G:180,B:140,A:255).
				/// </summary>
				public: static const Color Tan;

				/// <summary>
				/// Teal color (R:0,G:128,B:128,A:255).
				/// </summary>
				public: static const Color Teal;
       
				/// <summary>
				/// Thistle color (R:216,G:191,B:216,A:255).
				/// </summary>
				public: static const Color Thistle;
       
				/// <summary>
				/// Tomato color (R:255,G:99,B:71,A:255).
				/// </summary>
				public: static const Color Tomato;
        
    			/// <summary>
				/// Turquoise color (R:64,G:224,B:208,A:255).
				/// </summary>
				public: static const Color Turquoise;
        
				/// <summary>
				/// Violet color (R:238,G:130,B:238,A:255).
				/// </summary>
				public: static const Color Violet;
        
				/// <summary>
				/// Wheat color (R:245,G:222,B:179,A:255).
				/// </summary>
				public: static const Color Wheat;
	
				/// <summary>
				/// White color (R:255,G:255,B:255,A:255).
				/// </summary>
				public: static const Color White;
       
				/// <summary>
				/// WhiteSmoke color (R:245,G:245,B:245,A:255).
				/// </summary>
				public: static const Color WhiteSmoke;
        
				/// <summary>
				/// Yellow color (R:255,G:255,B:0,A:255).
				/// </summary>
				public: static const Color Yellow;
        
				/// <summary>
				/// YellowGreen color (R:154,G:205,B:50,A:255).
				/// </summary>
				public: static const Color YellowGreen;
	
				/// <summary>
				/// Performs linear interpolation of <see cref="Color"/>.
				/// </summary>
				/// <param name="value1">Source <see cref="Color"/>.</param>
				/// <param name="value2">Destination <see cref="Color"/>.</param>
				/// <param name="amount">Interpolation factor.</param>
				/// <returns>Interpolated <see cref="Color"/>.</returns>
				public: static const Color Lerp(Color value1, Color value2, System::Single amount)
				{
					//byte Red   = (byte)MathHelper::ClampF(MathHelper::Lerp(value1.R, value2.R, amount), Riccsson::System::Byte::MinValue, Riccsson::System::Byte::MaxValue);   
					//byte Green = (byte)MathHelper::ClampF(MathHelper::Lerp(value1.G, value2.G, amount), Riccsson::System::Byte::MinValue, Riccsson::System::Byte::MaxValue);
					//byte Blue  = (byte)MathHelper::ClampF(MathHelper::Lerp(value1.B, value2.B, amount), Riccsson::System::Byte::MinValue, Riccsson::System::Byte::MaxValue);
					//byte Alpha = (byte)MathHelper::ClampF(MathHelper::Lerp(value1.A, value2.A, amount), Riccsson::System::Byte::MinValue, Riccsson::System::Byte::MaxValue);
					//
					//return Color( Red, Green, Blue, Alpha );
					throw;
				}
		
				/// <summary>
				/// Multiply <see cref="Color"/> by value.
				/// </summary>
				/// <param name="value">Source <see cref="Color"/>.</param>
				/// <param name="scale">Multiplicator.</param>
				/// <returns>Multiplication result.</returns>
				public: static const Color Multiply( Color value, float scale)
				{
					byte Red = (byte)(MathHelper::ClampF(value.R * scale, Riccsson::System::Byte::MinValue, Riccsson::System::Byte::MaxValue));
					byte Green = (byte)(MathHelper::ClampF(value.G * scale, Riccsson::System::Byte::MinValue, Riccsson::System::Byte::MaxValue));
					byte Blue = (byte)(MathHelper::ClampF(value.B * scale, Riccsson::System::Byte::MinValue, Riccsson::System::Byte::MaxValue));
					byte Alpha = (byte)(MathHelper::ClampF(value.A * scale, Riccsson::System::Byte::MinValue, Riccsson::System::Byte::MaxValue)); 
					return Color( Red, Green, Blue, Alpha );
				}
		
				/// <summary>
				/// Converts <see cref="Color"/> to <see cref="Vector3"/>.
				/// </summary>
				/// <returns>Converted color.</returns>
				public: Vector3 ToVector3()
				{
					return Vector3(R / 255.0f, G / 255.0f, B / 255.0f);
				}
	
				/// <summary>
				/// Converts <see cref="Color"/> to <see cref="Vector4"/>.
				/// </summary>
				/// <returns>Converted color.</returns>
				public: Vector4 ToVector4()
				{
					return Vector4(R / 255.0f, G / 255.0f, B / 255.0f, A / 255.0f);
				}
	
				/// <summary>
				/// Converts the color values of this instance to its equivalent string representation.
				/// </summary>
				/// <returns>The string representation of the color value of this instance.</returns>
				public: override GC_PTR<Riccsson::System::string> ToString () const
				{
					//return string::Format("[Color: R={0}, G={1}, B={2}, A={3}, PackedValue={4}]", R, G, B, A, PackedValue);
					throw;
				}
	
				/// <summary>
				/// Translate a non-premultipled alpha <see cref="Color"/> to a <see cref="Color"/> that contains premultiplied alpha.
				/// </summary>
				/// <param name="vector">A <see cref="Vector4"/> representing color.</param>
				/// <returns>A <see cref="Color"/> which contains premultiplied alpha data.</returns>
				public: static const Color FromNonPremultiplied(Vector4 vector)
				{
					return Color(vector.X * vector.W, vector.Y * vector.W, vector.Z * vector.W, vector.W);
				}
	
				/// <summary>
				/// Translate a non-premultipled alpha <see cref="Color"/> to a <see cref="Color"/> that contains premultiplied alpha.
				/// </summary>
				/// <param name="r">Red component value.</param>
				/// <param name="g">Green component value.</param>
				/// <param name="b">Blue component value.</param>
				/// <param name="a">Alpha component value.</param>
				/// <returns>A <see cref="Color"/> which contains premultiplied alpha data.</returns>
				public: static const Color FromNonPremultiplied(int r, int g, int b, int a)
				{
					return Color((byte)(r * a / 255),(byte)(g * a / 255), (byte)(b * a / 255), a);
				}

				#pragma region Riccsson::System::Generic::IEquatable<Color> Members
	
				/// <summary>
				/// Compares whether current instance is equal to specified <see cref="Color"/>.
				/// </summary>
				/// <param name="other">The <see cref="Color"/> to compare.</param>
				/// <returns><c>true</c> if the instances are equal; <c>false</c> otherwise.</returns>
				public: bool Equals(Color other)
				{
				return this->PackedValue == other.PackedValue;
				}

				#pragma endregion
			};


			/// <summary>
			/// Compares whether two <see cref="Color"/> instances are not equal.
			/// </summary>
			/// <param name="a"><see cref="Color"/> instance on the left of the not equal sign.</param>
			/// <param name="b"><see cref="Color"/> instance on the right of the not equal sign.</param>
			/// <returns><c>true</c> if the instances are not equal; <c>false</c> otherwise.</returns>	
			inline bool operator !=(Color a, Color b)
			{
				return !(a.A == b.A &&
					a.R == b.R &&
					a.G == b.G &&
					a.B == b.B);
			}

			/// <summary>
			/// Compares whether two <see cref="Color"/> instances are equal.
			/// </summary>
			/// <param name="a"><see cref="Color"/> instance on the left of the equal sign.</param>
			/// <param name="b"><see cref="Color"/> instance on the right of the equal sign.</param>
			/// <returns><c>true</c> if the instances are equal; <c>false</c> otherwise.</returns>
			inline bool operator ==(Color a, Color b)
			{
				return (a.A == b.A &&
					a.R == b.R &&
					a.G == b.G &&
					a.B == b.B);
			}

			/// <summary>
			/// Multiply <see cref="Color"/> by value.
			/// </summary>
			/// <param name="value">Source <see cref="Color"/>.</param>
			/// <param name="scale">Multiplicator.</param>
			/// <returns>Multiplication result.</returns>
			inline Color operator *(Color value, float scale)
			{
				return Color::Multiply(value, scale);
			}	
		}
	}
}

#endif
